package IOStream.CharStream;

import java.io.FileReader;
import java.io.IOException;

/**
 * ClassName:CharSet005
 * Package:IOStream.CharSet
 * Description:
 *
 * @Author:ZhangXin
 * @Create2023/3/1-20:58
 * @Version:v1.0
 */
public class CharStream001 {
    /**
     * 1.读取数据时未读取完整个汉字(字节流：一次读取一个字节)
     * <p>
     * 字符流：字符流的底层其实就是字节流
     * <p>
     * 字符流 = 字节流 +字符集
     * <p>
     * 特点
     * 输入流：一次读一个字节,遇到中文时,一次读多个字节
     * 输出流：底层会把数据按照指定的编码方式进行编码,变成字节再写到文件中
     * <p>
     * 使用场景：对于纯文本文件进行读写操作
     * <p>
     * 字符流
     * Reader(字符输入流)    Writer(字符输出流)
     * FileReader(操作本地文件的字符输入流)
     * FileWriter(操作本地文件的字符输出流)
     **/
    public static void main(String[] args) throws IOException {

        /**FileReader
         * 1.创建字符流对象
         * public FileReader(File file) 创建字符输入流关联本地文件
         * public FileReader(String pathname) 创建字符输入流关联本地文件
         * 细节：如果文件不存在,就直接报错
         * 2.读取数据
         * public int read() 读取数据,读到末尾返回-1
         * public int read(char[] buffer) 读取多个数据,读到末尾返回-1
         * 细节：1.按字节进行读取,遇到中文,一次读多个字节,读取后解码,返回一个整数
         * 细节：2.读到文件末尾了,read方法返回-1
         * 3.释放资源/关流*/
        //创建对象,并关联本地文件
        FileReader fr = new FileReader("E:\\aaa\\a.txt");
        //读取数据
        //字符流的底层也是字节流,默认也是一个字节一个字节的读取
        //如果遇到中文就会一次读取多个,GBK一次读两个字节,UTF-8一次读三个字节
        //read()细节
        //1.read()：默认也是一个字节一个字节的读取,如果遇到中文就会一次读取多个
        //2.在读取之后,方法的底层还会进行解码并转成十进制
        int ch;
        while ((ch = fr.read()) != -1) {
            System.out.print((char) ch);
        }
        //释放资源
        fr.close();
    }
}
